package table
import (
"fmt"
"github.com/K-Phoen/grabana/errors"
"github.com/K-Phoen/grabana/links"
"github.com/K-Phoen/grabana/target/graphite"
"github.com/K-Phoen/grabana/target/influxdb"
"github.com/K-Phoen/grabana/target/prometheus"
"github.com/K-Phoen/sdk"
)
type Option func (table *Table ) error
type AggregationType string
const (
AVG AggregationType = "avg"
Count AggregationType = "count"
Current AggregationType = "current"
Min AggregationType = "min"
Max AggregationType = "max"
)
type Aggregation struct {
Label string
Type AggregationType
}
type Table struct {
Builder *sdk .Panel
}
func New (title string , options ...Option ) (*Table , error ) {
panel := &Table {Builder : sdk .NewTable (title )}
empty := ""
panel .Builder .IsNew = false
panel .Builder .TablePanel .Styles = []sdk .ColumnStyle {
{
Alias : &empty ,
Pattern : "/.*/" ,
Type : "string" ,
},
}
for _ , opt := range append (defaults (), options ...) {
if err := opt (panel ); err != nil {
return nil , err
}
}
return panel , nil
}
func defaults() []Option {
return []Option {
Span (6 ),
TimeSeriesToRows (),
}
}
func Links (panelLinks ...links .Link ) Option {
return func (table *Table ) error {
table .Builder .Links = make ([]sdk .Link , 0 , len (panelLinks ))
for _ , link := range panelLinks {
table .Builder .Links = append (table .Builder .Links , link .Builder )
}
return nil
}
}
func WithPrometheusTarget (query string , options ...prometheus .Option ) Option {
target := prometheus .New (query , options ...)
return func (table *Table ) error {
table .Builder .AddTarget (&sdk .Target {
RefID : target .Ref ,
Expr : target .Expr ,
IntervalFactor : target .IntervalFactor ,
Interval : target .Interval ,
Step : target .Step ,
LegendFormat : target .LegendFormat ,
Instant : target .Instant ,
Format : target .Format ,
})
return nil
}
}
func WithGraphiteTarget (query string , options ...graphite .Option ) Option {
target := graphite .New (query , options ...)
return func (table *Table ) error {
table .Builder .AddTarget (target .Builder )
return nil
}
}
func WithInfluxDBTarget (query string , options ...influxdb .Option ) Option {
target := influxdb .New (query , options ...)
return func (table *Table ) error {
table .Builder .AddTarget (target .Builder )
return nil
}
}
func HideColumn (columnLabelPattern string ) Option {
return func (table *Table ) error {
table .Builder .TablePanel .Styles = append ([]sdk .ColumnStyle {
{
Pattern : columnLabelPattern ,
Type : "hidden" ,
},
}, table .Builder .TablePanel .Styles ...)
return nil
}
}
func TimeSeriesToRows () Option {
return func (table *Table ) error {
table .Builder .TablePanel .Transform = "timeseries_to_rows"
return nil
}
}
func TimeSeriesToColumns () Option {
return func (table *Table ) error {
table .Builder .TablePanel .Transform = "timeseries_to_columns"
return nil
}
}
func AsJSON () Option {
return func (table *Table ) error {
table .Builder .TablePanel .Transform = "json"
return nil
}
}
func AsTable () Option {
return func (table *Table ) error {
table .Builder .TablePanel .Transform = "table"
return nil
}
}
func AsAnnotations () Option {
return func (table *Table ) error {
table .Builder .TablePanel .Transform = "annotations"
return nil
}
}
func AsTimeSeriesAggregations (aggregations []Aggregation ) Option {
return func (table *Table ) error {
columns := make ([]sdk .Column , 0 , len (aggregations ))
for _ , aggregation := range aggregations {
columns = append (columns , sdk .Column {
TextType : aggregation .Label ,
Value : string (aggregation .Type ),
})
}
table .Builder .TablePanel .Transform = "timeseries_aggregations"
table .Builder .TablePanel .Columns = columns
return nil
}
}
func DataSource (source string ) Option {
return func (table *Table ) error {
table .Builder .Datasource = &sdk .DatasourceRef {LegacyName : source }
return nil
}
}
func Span (span float32 ) Option {
return func (table *Table ) error {
if span < 1 || span > 12 {
return fmt .Errorf ("span must be between 1 and 12: %w" , errors .ErrInvalidArgument )
}
table .Builder .Span = span
return nil
}
}
func Height (height string ) Option {
return func (table *Table ) error {
table .Builder .Height = &height
return nil
}
}
func Description (content string ) Option {
return func (table *Table ) error {
table .Builder .Description = &content
return nil
}
}
func Transparent () Option {
return func (table *Table ) error {
table .Builder .Transparent = true
return nil
}
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .